CMAKE_MINIMUM_REQUIRED( VERSION 2.6 )
PROJECT( "glew" )

SET( SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src )
SET( INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include )
SET( RC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build )

SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )

OPTION( glew-cmake_BUILD_SHARED "Build the shared glew library" ON )
OPTION( glew-cmake_BUILD_STATIC "Build the static glew library" ON )
OPTION( glew-cmake_BUILD_SINGLE_CONTEXT "Build the single context glew library" ON )
OPTION( glew-cmake_BUILD_MULTI_CONTEXT "Build the multi context glew library" ON )


SET( LIBGLEW_SRCS ${SRC_DIR}/glew.c )

IF( WIN32 )
	ADD_DEFINITIONS( -DWIN32_MEAN_AND_LEAN -DVC_EXTRALEAN -D_CRT_SECURE_NO_WARNINGS )
ENDIF(  )

IF( MSVC )
	LIST( APPEND LIBGLEW_SRCS ${RC_DIR}/glew.rc )
ENDIF(  )

IF( NOT USE_GLU )
	ADD_DEFINITIONS( -DGLEW_NO_GLU )
ENDIF(  )

IF( WIN32 )
	SET( GL_LIBRARY opengl32 )
ELSEIF( APPLE )
	FIND_LIBRARY( GL_LIBRARY OpenGL )
	FIND_LIBRARY( AGL_LIBRARY AGL )
	SET( PLATFORM_SPECIFIC_LIBRARIES ${AGL_LIBRARY} )
ELSE(  )
	SET( GL_LIBRARY GL )
	SET( PLATFORM_SPECIFIC_LIBRARIES X11 dl Xext )
ENDIF(  )

IF ( glew-cmake_BUILD_STATIC )
	IF ( glew-cmake_BUILD_SINGLE_CONTEXT )
		ADD_LIBRARY( libglew_static STATIC ${LIBGLEW_SRCS} )

		SET_TARGET_PROPERTIES( libglew_static PROPERTIES
		                       ARCHIVE_OUTPUT_NAME "glew"
		                       DEBUG_POSTFIX d )
		TARGET_INCLUDE_DIRECTORIES( libglew_static PUBLIC ${INCLUDE_DIR} )
		TARGET_COMPILE_DEFINITIONS( libglew_static PUBLIC GLEW_STATIC )
		TARGET_LINK_LIBRARIES( libglew_static ${GL_LIBRARY} ${PLATFORM_SPECIFIC_LIBRARIES} )
		INSTALL( TARGETS libglew_static ARCHIVE DESTINATION lib )
	ENDIF (  )

	IF ( glew-cmake_BUILD_MULTI_CONTEXT )
		ADD_LIBRARY( libglewmx_static STATIC ${LIBGLEW_SRCS} )

		SET_TARGET_PROPERTIES( libglewmx_static PROPERTIES
		                       ARCHIVE_OUTPUT_NAME "glewmx"
		                       DEBUG_POSTFIX d )
		TARGET_COMPILE_DEFINITIONS( libglewmx_static INTERFACE GLEW_MX)
		TARGET_INCLUDE_DIRECTORIES( libglewmx_static PUBLIC ${INCLUDE_DIR} )
		TARGET_COMPILE_DEFINITIONS( libglewmx_static PUBLIC GLEW_STATIC )
		TARGET_LINK_LIBRARIES( libglewmx_static ${GL_LIBRARY} ${PLATFORM_SPECIFIC_LIBRARIES} )
		INSTALL( TARGETS libglewmx_static ARCHIVE DESTINATION lib )
	ENDIF (  )
ENDIF (  )

IF ( glew-cmake_BUILD_SHARED )
	IF ( glew-cmake_BUILD_SINGLE_CONTEXT )
		ADD_LIBRARY( libglew_shared SHARED ${LIBGLEW_SRCS} )

		SET_TARGET_PROPERTIES( libglew_shared PROPERTIES
		                       RUNTIME_OUTPUT_NAME "glew"
		                       LIBRARY_OUTPUT_NAME "glew"
		                       DEBUG_POSTFIX d )

		TARGET_INCLUDE_DIRECTORIES( libglew_shared PUBLIC ${INCLUDE_DIR} )
		TARGET_COMPILE_DEFINITIONS( libglew_shared PUBLIC GLEW_BUILD )
		TARGET_LINK_LIBRARIES( libglew_shared ${GL_LIBRARY} ${PLATFORM_SPECIFIC_LIBRARIES} )
		INSTALL( TARGETS libglew_shared ARCHIVE DESTINATION lib
		                                LIBRARY DESTINATION lib
		                                RUNTIME DESTINATION bin )
	ENDIF (  )

	IF ( glew-cmake_BUILD_MULTI_CONTEXT )
		ADD_LIBRARY( libglewmx_shared SHARED ${LIBGLEW_SRCS} )

		SET_TARGET_PROPERTIES( libglewmx_shared PROPERTIES
		                       RUNTIME_OUTPUT_NAME "glewmx"
		                       LIBRARY_OUTPUT_NAME "glewmx"
		                       DEBUG_POSTFIX d )

		TARGET_COMPILE_DEFINITIONS( libglewmx_shared INTERFACE GLEW_MX)
		TARGET_INCLUDE_DIRECTORIES( libglewmx_shared PUBLIC ${INCLUDE_DIR} )
		TARGET_COMPILE_DEFINITIONS( libglewmx_shared PUBLIC GLEW_BUILD )
		TARGET_LINK_LIBRARIES( libglewmx_shared ${GL_LIBRARY} ${PLATFORM_SPECIFIC_LIBRARIES} )
		INSTALL( TARGETS libglewmx_shared ARCHIVE DESTINATION lib
		                                  LIBRARY DESTINATION lib
		                                  RUNTIME DESTINATION bin )
	ENDIF (  )
ENDIF (  )

FILE( GLOB PUBLIC_HEADERS "include/GL/*.h" )
INSTALL( FILES ${PUBLIC_HEADERS} DESTINATION include/GL/ )

IF( ${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_SOURCE_DIR} AND NOT ONLY_LIBS )
	SET( GLEWINFO_SRCS ${SRC_DIR}/glewinfo.c )
	SET( VISUALINFO_SRCS ${SRC_DIR}/visualinfo.c )
	IF( MSVS )
		LIST( APPEND GLEWINFO_SRCS ${RC_DIR}/glewinfo.rc )
		LIST( APPEND VISUALINFO_SRCS ${RC_DIR}/visualinfo.rc )
	ENDIF(  )

	ADD_EXECUTABLE( glewinfo ${GLEWINFO_SRCS} )
	ADD_EXECUTABLE( visualinfo ${VISUALINFO_SRCS} )

	IF ( glew-cmake_BUILD_STATIC )
		TARGET_LINK_LIBRARIES( glewinfo libglew_static )
		TARGET_LINK_LIBRARIES( visualinfo libglew_static )
	ELSE ( )
		TARGET_LINK_LIBRARIES( glewinfo libglew_shared )
		TARGET_LINK_LIBRARIES( visualinfo libglew_shared )
	ENDIF (  )

	INSTALL( TARGETS glewinfo visualinfo DESTINATION bin )
ENDIF(  )
